var createError = require('http-errors');     // http-errors 记录http 异常
var express = require('express');   // express 包含API 
var path = require('path');  // Node 自带模块   无需安装 
var cookieParser = require('cookie-parser');  //  处理 cookies 
var logger = require('morgan');  // 记录服务器日志 

// 路由配置文件 
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var commentRouter = require('./routes/comment');
var vueRouter = require("./routes/vue")

var connection = require("./utils/connect")
var app = express();
var session = require("express-session");
var cors = require("cors");

app.use(cors({
  "origin": "*",
  "methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
  "preflightContinue": false,
  "optionsSuccessStatus": 204
}));
// view engine setup
app.set('views', path.join(__dirname, 'views')); // 设置项目视图文件目录  __dirname 根目录 views 重置根路径
app.set('view engine', 'ejs');    // 设置模板引擎  ejs 

app.use(logger('dev'));   // 日志记录中间件
app.use(express.json());  // 处理 post 请求提交的参数 application/json JSON 格式 
app.use(express.urlencoded({ extended: false })); // POST application/x-www-urlencoded 字符串
app.use(cookieParser());  // 处理 cookies
app.use(express.static(path.join(__dirname, 'public')));  // express.static 设置项目静态文件目录 以文件名读取  把public 重置 到根路径 

app.use(function(req,res,next){
    console.log("this is first middleware...")
    next()
})

// session 中间件  必须写在路由中间件前面  (用来保存用户登录后的所有数据)
app.use(session({
  name:"AppTest",
  cookie:{maxAge:1000*60*60*24},  // session 时长
  secret:"test",
  resave:false,
  saveUninitialized:true
}))


// 设置路由中间键 
app.use('/', indexRouter);   // wh 路由别名 区别每个路由模块   /wh/login
app.use('/users', usersRouter);  // users 路由别名 区别每个路由模块   /users/login 
app.use('/comment',commentRouter);
app.use('/vue',vueRouter) 

app.use(function(req,res,next){
    console.log("catch error --- middleware");
    next();
})

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);   // 500 服务器异常 
  // res.render('./views/error.ejs');
  res.render('error');      // res.render 渲染 ejs 模板 

});



module.exports = app;
